#coding=UTF-8
from datetime import datetime, timedelta
import unittest
from app import create_app, db
from app.models import User, Post
from config import Config

# unittest单元测试框架

class TestConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite://'

class UserModelCase(unittest.TestCase):
    #如果setup()方法在测试中发生异常，测试方法不会执行
    def setUp(self):
        self.app = create_app(TestConfig)
        self.app_context = self.app_context()
        self.app_context.push()
        # 创建表
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()
        self.app_context.pop()
        
    # 测试密码哈希值
    def test_possword_hashing(self):
        u = User(username = 'susan')
        u.set_password('cat')
        self.assertFalse(u.check_password('dog'))
        self.assertTrue(u.check_password('cat'))
    # 测试头像
    def test_avatar(self):
        u = User(username = 'john', email = 'john@example.com')
        self.assertEqual(u.avatar(128),('https://www.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?d=identicon&s=128'))
    # 测试关注
    def test_follow(self):
        # 数据库数据初始化和检测
        u1 = User(username = 'john', email = 'john@example.com')
        u2 = User(username = 'susan', email = 'susan@example.com')
        db.session.add(u1)
        db.session.add(u2)
        db.session.commit()
        self.assertEqual(u1.followed.all(),[])
        self.assertEqual(u1.followers.all(),[])
        # u1关注u2测试
        u1.follow(u2)
        db.session.commit()
        self.assertTrue(u1.is_following(u2))
        self.assertEqual(u1.followed.count(),1)
        self.assertEqual(u1.followed.first().username, 'susan')
        self.assertEqual(u2.followers.count(),1)
        self.assertEqual(u2.followers.first().username,'john')
        # 取消关注
        u1.unfollow(u2)
        db.session.commit()
        self.assertFalse(u1.is_following(u2))
        self.assertEqual(u1.followed.count(), 0)
        self.assertEqual(u2.followers.count(), 0)
    # 测试关注者的帖子
    def test_follow_posts(self):
        u1 = User(username = 'john', email = 'john@example.com')
        u2 = User(username = 'susan', email = 'susan@example.com')
        u3 = User(username = 'mary', email = 'mary@example.com')
        u4 = User(username = 'david', email = 'david@example.com')
        db.session.add_all([u1,u2,u3,u4])

        # create four posts
        # timedelta()表示两个时间之间的差值，
        # now + timedelta(seconds = 1)增加一秒后的时间
        now = datetime.utcnow()
        p1 = Post(body = "post from john",  author = u1, timestamp = now + timedelta(seconds = 1))
        p2 = Post(body = "post from susan", author = u2, timestamp = now + timedelta(seconds = 4))
        p3 = Post(body = "post from mary",  author = u3, timestamp = now + timedelta(seconds = 3))
        p4 = Post(body = "post from david", author = u4, timestamp = now + timedelta(seconds = 2))
        timestamp = now + timedelta(seconds = 2)
        db.session.add_all([p1,p2,p3,p4])
        db.session.commit()

        # setup the followers

        u1.follow(u2)
        u1.follow(u4)
        u2.follow(u3)
        u3.follow(u4)
        db.session.commit()

        # check the followed posts of eche user

        f1 = u1.followed_posts().all()
        f2 = u2.followed_posts().all()
        f3 = u3.followed_posts().all()
        f4 = u4.followed_posts().all()
        self.assertEqual(f1,[p2,p4,p1])
        self.assertEqual(f2,[p2,p3])
        self.assertEqual(f3,[p3,p4])
        self.assertEqual(f4,[p4])

if __name__ == '__main__':
    unittest.main(verbosity = 2)
